home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / breakpt.arc / BREAKPT.ASM next >
Assembly Source File  |  1984-10-19  |  4KB  |  92 lines

  1. PAGE 60,132
  2. ; BREAKPT.ASM: A DEBUGGING UTILITY
  3. ; TO BE USED IN CONJUNCTION WITH THE DOS DEBUG UTILITY OR ANY DEBUGGER
  4. ; WHICH CAN INTERCEPT THE BREAKPOINT INTERRUPT.
  5. ; USAGE: RUN BREAKPT.COM ONCE UNDER DOS TO INSTALL.
  6. ;        LOAD DEBUGGER WITH PROGRAM TO BE DEBUGGED.
  7. ;        SET A BREAKPOINT (ANY BREAKPOINT) AND EXECUTE PROGRAM.
  8. ;        WHILE PROGRAM RUNS, HITTING CTRL-ESC JUMPS TO THIS ROUTINE,
  9. ;        WHICH HANDS CONTROL TO DEBUGGER.
  10. ;        NOTE THIS METHOD CAN BE USED TO INTERRUPT BOTH ROM
  11. ;        AND RAM EXECUTION.
  12. ;                               PROGRAM BY RICH WINKEL
  13. BOTTOM  SEGMENT AT 0H
  14.         ORG     024H
  15. KBDIP   DW      ?               ;IP FOR KBD INT
  16. KBDCS   DW      ?               ;CS FOR KBD INT
  17.         ORG     0417H
  18. KB_FLAG DB      ?               ;ROM BIOS DATA
  19. BOTTOM  ENDS
  20. ;
  21. BREAKPT SEGMENT
  22.         ASSUME CS:BREAKPT,DS:BOTTOM
  23.         ORG     100H
  24. MAIN    PROC    NEAR
  25.         JMP     INIT
  26. ;
  27. ; KEYBOARD INTERRUPT INTERCEPT ROUTINE
  28. ;
  29. CATCH:  STI                     ;INTERRUPTS BACK ON
  30.         PUSH    AX
  31.         IN      AL,60H          ;CHECK SCAN CODE
  32.         CMP     AL,01H          ;IS IT ESC KEY?
  33.         JNZ     L2              ;NO, ON TO KEYBOARD ROUTINE
  34.         PUSH    DS              ;OTHERWISE, CHECK FOR
  35.         XOR     AX,AX           ;CONTROL KEY SHIFT
  36.         MOV     DS,AX           ;GET DOWN TO THE BOTTOM
  37.         MOV     AL,KB_FLAG      ;GET KEYBOARD FLAG BYTE FROM ROM DATA
  38.         TEST    AL,04H          ;CTRL SHIFT?
  39.         JZ      L1              ;NO, ON TO KEYBOARD ROUTINE
  40.         IN      AL,61H          ;OTHERWISE, WE TAKE IT FROM HERE
  41.         MOV     AH,AL           ;RESET
  42.         OR      AL,80H          ;THE
  43.         OUT     61H,AL          ;KEYBOARD
  44.         MOV     AL,AH           ;CONTROL
  45.         OUT     61H,AL          ;PORT
  46.         CLI                     ;TURN OFF INTERRUPTS
  47.         MOV     AL,20H          ;RESET INTERRUPT CONTROLLER (8259)
  48.         OUT     20H,AL
  49.         POP     DS
  50.         POP     AX
  51.         STI                     ;LET PENDING INTERRUPTS EXECUTE
  52.         NOP
  53.         INT     03H             ;NOW GIVE DEBUG CONTROL
  54.         IRET                    ;SINGLE STEP BACK TO INTERRUPTED PGM
  55. L1:     POP     DS              ;ONWARD TO KBD ROUTINE
  56. L2:     POP     AX
  57.         DB      0EAH            ;PREFIX BYTE FOR FAR JUMP
  58. JFARIP  DW      0H              ;IP FOR KBD ROUTINE
  59. JFARCS  DW      0H              ;CS FOR KBD ROUTINE
  60. INIT:   XOR     AX,AX           ;GET INTO
  61.         MOV     DS,AX           ;BOTTOM SEGMENT
  62.         MOV     AX,KBDIP        ;GET IP FOR KBD INTERRUPT
  63.         MOV     CS:JFARIP,AX    ;PUT IN OUR FAR JUMP
  64.         MOV     AX,KBDCS        ;GET CS FOR KBD INTERRUPT
  65.         MOV     CS:JFARCS,AX    ;PUT IN OUR FAR JUMP
  66.         MOV     AX,CS           ;BACK TO
  67.         MOV     DS,AX           ;OUR SEGMENT
  68.         MOV     DX,OFFSET CATCH ;USE DOS TO POINT KBD INT TO US
  69.         MOV     AX,2509H        ;'RESET INT 9H VECTOR TO DS:DX'
  70.         INT     21H             ;DO IT
  71.         MOV     AH,09H          ;PRINT MESSAGE
  72.         MOV     DX,OFFSET MSG   ;POINT TO MESSAGE
  73.         INT     21H             ;DO IT
  74.         MOV     DX,OFFSET INIT  ;GET LAST ADDRESS OF RESIDENT CODE
  75.         INT     27H             ;TERMINATE AND STAY RESIDENT
  76. ;
  77. MSG     DB 'Breakpoint debugging utility.',0DH,0AH
  78.         DB 'Load a program under DEBUG, '
  79.         DB 'set a breakpoint, (any breakpoint) and go.',0DH,0AH
  80.         DB 'To stop the program for debugging, hit Ctrl-Esc, then type:',0DH,0AH
  81.         DB  09H,'RIP <enter> 12D <enter> T <enter>',0DH,0AH
  82.         DB 'to jump over the INT 3, execute an IRET, and',0DH,0AH
  83.         DB 'get back to where your program was executing.',0DH,0AH
  84.         DB "WARNING: Don't hit Ctrl-Esc except while under DEBUG!$"
  85. ;
  86. MAIN    ENDP
  87. BREAKPT ENDS
  88.         END MAIN
  89. P
  90. BREAKPT ENDS
  91.         END MAIN
  92.